package com.iocaop.uaa.security.UserDetails;

import com.iocaop.uaa.repository.UserRepo;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsPasswordService;
import org.springframework.stereotype.Service;

/**
 * 密码升级  用户登录时自动升级密码加密方式
 */
@Service
@RequiredArgsConstructor
public class UserDetailsPasswordServiceImpl implements UserDetailsPasswordService {

    private final UserRepo userRepo;

    /**
     *
     * @param userDetails 当前认证的用户
     * @param newPassword security 升级密码后的加密串
     * @return 修改密码为最新加密方式的UserDetails
     */
    @Override public UserDetails updatePassword(UserDetails userDetails, String newPassword) {
        // 需要返回一个密码升级后的UserDetails 查出来的是一个 Optional 用新特性的方式判断数据库有没有当前认证的用户，如果有就改数据库并返回
        // 没有就返回原来的
        return userRepo.findOptionalByUsername(userDetails.getUsername())
            .map(user ->{
                // with 是lombok注解提供，在当前对象基础上修改属性返回一个新的对象
                return (UserDetails) userRepo.save(user.withPassword(newPassword));
            })
            .orElse(userDetails);
    }

}
